#include "Estruturas.h"
#include "Utilitarios.h"
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

void gravaEspecieArquivo(FILE *file,Especie especie){
  fseek(file,0,SEEK_END); 
  gravarInteiroArquivo(especie.id,file);
  gravarStringArquivo(especie.nomeCientifico,file);
  gravarStringArquivo(especie.nomePopular,file);
  gravarStringArquivo(especie.descricao,file);
  gravarCharArquivo('1', file);
}

void desalocaEspecie(Especie especie){
  free(especie.descricao);
  free(especie.nomeCientifico);
  free(especie.nomePopular);
}

Especie lerEspecieArquivo(FILE *file,char *valido){
  Especie especie;
  especie.id = lerInteiroArquivo(file);
  especie.nomeCientifico = lerStringArquivo(file);
  especie.nomePopular = lerStringArquivo(file);
  especie.descricao = lerStringArquivo(file);
  *valido = lerCharArquivo(file);
  return especie;
}

Especie lerEspecieID(FILE *file, int idEspecie){
  Especie especie;
  especie.id = -1;
  int encontrou = 0;
  char valido = '0';
  fseek(file,0,SEEK_SET);

  while((!encontrou) && (!feof(file))){
    especie = lerEspecieArquivo(file, &valido);
    encontrou = (especie.id == idEspecie) && (valido == '1');
    if (!encontrou){
      desalocaEspecie(especie);
      especie.id = -1;
    }
  }

  return especie;
}

int removeEspecieID(FILE *file, int idEspecie){
  fseek(file,0,SEEK_SET);
  Especie especie = lerEspecieID(file, idEspecie);
  if (especie.id == -1){
    return 0;
  }
  fseek(file,-1,SEEK_CUR);
  gravarCharArquivo('0',file);
  desalocaEspecie(especie);
  return 1;
}

int novoIDEspecie(){
    static int idEspecie = 0;
    return idEspecie++;
}

void escreveArquivo(FILE *file){
  int idEspecie = novoIDEspecie();
  char nomeCientifico[40];
  char nomePopular[40];
  char descricao[300];
  Especie novaEspecie;

  printf("\nDigite o nome cientifico: ");
  getchar();
  gets(nomeCientifico);
  //scanf("%39s", nomeCientifico);

  printf("\nDigite o nome popular: ");
  gets(nomePopular);
  //scanf("%39s", nomePopular);

  printf("\nDigite a descricao: ");
  gets(descricao);
  //scanf("%299s", descricao);

  novaEspecie.id = idEspecie;
  novaEspecie.nomeCientifico = nomeCientifico;
  novaEspecie.nomePopular = nomePopular;
  novaEspecie.descricao = descricao;

  gravaEspecieArquivo(file,novaEspecie);
  fclose(file);
}

//Funcao de teste
void lerArquivo(){
  char valido = 1;
  FILE *file = fopen("especies.txt","r");
  Especie especie1 = lerEspecieArquivo(file, &valido);
  Especie especie2 = lerEspecieArquivo(file, &valido);
  printf("Id %d - Especie: %s\n", especie1.id, especie1.nomePopular);
  printf("Id %d - Especie: %s\n", especie2.id, especie2.nomePopular);
  desalocaEspecie(especie1);
  desalocaEspecie(especie2);
}

//Funcao de teste
void buscaArquivo(){
  FILE *file = fopen("especies.txt","r");
  Especie especie2 = lerEspecieID(file,1);
  if(especie2.id != -1){
    printf("Id %d - Especie: %s\n", especie2.id, especie2.nomePopular);
  }else{
    printf("Especie não encontrada.\n");
  }
  desalocaEspecie(especie2);
}

//Funcao de teste
void removeEspecie(){
  FILE *file = fopen("especies.txt","rw+");
  if (removeEspecieID(file,1)) {
    printf("Removido com sucesso\n");
  }else{
    printf("Não Removido\n");
  }
  fclose(file);
}

/*int main(){
  escreveArquivo();
  lerArquivo();
  removeEspecie();
  buscaArquivo();
}*/
